/**
 * Copyright (C) 2014 Luvina Software Company
 * AddUserInputController.java, Dec 15, 2014, Nguyen Huu Luan LA11_AM
 *
 */
package net.luvina.manageuser.controllers;

import java.io.IOException;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.List;

import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import net.luvina.manageuser.entities.MstGroup;
import net.luvina.manageuser.entities.MstJapan;
import net.luvina.manageuser.entities.UserInfor;
import net.luvina.manageuser.logics.impl.MstGroupLogicImpl;
import net.luvina.manageuser.logics.impl.MstJapanLogicImpl;
import net.luvina.manageuser.utils.Common;
import net.luvina.manageuser.utils.Constant;
import net.luvina.manageuser.validates.ValidateUser;

/**
 * Servlet implementation class AddUserInputController
 * 
 * @author luan
 */
public class AddUserInputController extends HttpServlet {
	private static final long serialVersionUID = 1L;

	/**
	 * @see HttpServlet#HttpServlet()
	 */
	public AddUserInputController() {
		super();
		// TODO Auto-generated constructor stub
	}

	/**
	 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse
	 *      response)
	 */
	protected void doGet(HttpServletRequest request,
			HttpServletResponse response) throws ServletException, IOException {
		setDataLogicADM003(request, response);
		UserInfor userInfor = setDefaultValue(request, response);
		// Set userInfor lên request.
		request.setAttribute("userInfor", userInfor);
		// Forwarding
		RequestDispatcher req = request.getRequestDispatcher(Constant.ADM003);
		req.forward(request, response);
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see
	 * javax.servlet.http.HttpServlet#doPost(javax.servlet.http.HttpServletRequest
	 * , javax.servlet.http.HttpServletResponse)
	 */
	@Override
	protected void doPost(HttpServletRequest request,
			HttpServletResponse response) throws ServletException, IOException {
		// Địa chỉ forward đối tượng userInfor.
		String target = "";
		// Tạo session cho request.
		HttpSession session = request.getSession();
		// Thiết lập dữ liệu cho các hạng mục trên màn hình ADM003.
		setDataLogicADM003(request, response);
		/*
		 * Tạo mới danh sách lỗi và đối tượng userInfor.
		 */
		List<String> listError = new ArrayList<String>();
		UserInfor userInfor = new UserInfor();
		/*
		 * 
		 * 
		 * 
		 * Set giá trị các thuộc tính cho đối tượng, các giá trị lấy từ ADM003.
		 */
		userInfor.setLoginName(request.getParameter("loginName"));
		userInfor.setGroupId(Integer.parseInt(request.getParameter("groupId")));
		userInfor.setFullName(request.getParameter("fullName"));
		userInfor.setFullNameKana(request.getParameter("fullNameKana"));
		// Ngày sinh.
		int[] birthdayADM003 = new int[3];
		birthdayADM003[0] = Integer.parseInt(request.getParameter("birthYear"));
		birthdayADM003[1] = Integer
				.parseInt(request.getParameter("birthMonth"));
		birthdayADM003[2] = Integer.parseInt(request.getParameter("birthDay"));
		userInfor.setBirthdayADM003(birthdayADM003);

		userInfor.setEmail(request.getParameter("email"));
		userInfor.setTel(request.getParameter("tel"));
		userInfor.setPassword(request.getParameter("password"));
		userInfor.setPasswordConfirm(request.getParameter("passwordConfirm"));
		userInfor.setCodeLevel(request.getParameter("codeLevel"));
		// Ngày hiệu lực của trình độ tiếng Nhật.
		int[] startDateADM003 = new int[3];
		startDateADM003[0] = Integer
				.parseInt(request.getParameter("startYear"));
		startDateADM003[1] = Integer.parseInt(request
				.getParameter("startMonth"));
		startDateADM003[2] = Integer.parseInt(request.getParameter("startDay"));
		userInfor.setStartDateADM003(startDateADM003);
		// Ngày hết hạn trình độ tiếng Nhật.
		int[] endDateADM003 = new int[3];
		endDateADM003[0] = Integer.parseInt(request.getParameter("endYear"));
		endDateADM003[1] = Integer.parseInt(request.getParameter("endMonth"));
		endDateADM003[2] = Integer.parseInt(request.getParameter("endDay"));
		userInfor.setEndDateADM003(endDateADM003);
		// Tổng điểm.
		userInfor.setTotalADM003(request.getParameter("totalADM003"));
		/*
		 * 
		 * 
		 * Validate UserInfor để lấy danh sách lỗi nếu có.
		 */
		listError = ValidateUser.validateUser(userInfor);
		// Nếu có lỗi xảy ra, đồng thời gửi userInfor sang ADM003.
		if (listError.size() != 0) {
			request.setAttribute("userInfor", userInfor);
			target = Constant.ADM003;
		} else {
			// Nếu không có lỗi xảy ra, đưa user lên session và chuyển đến màn
			// hình ADM004.
			session.setAttribute("userInfor", userInfor);
			target = Constant.ADM004;
		}
		/*
		 * 
		 * Lưu dữ liệu lên request.
		 */
		request.setAttribute("listError", listError);
		/*
		 * Dispatching.
		 */
		RequestDispatcher req = request.getRequestDispatcher(target);
		req.forward(request, response);
	}

	/**
	 * Thiết lập dữ liệu cho màn hình ADM003.
	 * 
	 * @param request
	 *            HttpServletRequest
	 * @param response
	 *            HttpServletResponse
	 * @throws ServletException
	 * @throws IOException
	 */
	protected void setDataLogicADM003(HttpServletRequest request,
			HttpServletResponse response) throws ServletException, IOException {
		// Danh sách ngày tháng năm.
		List<Integer> listYear = new ArrayList<Integer>();
		List<Integer> listYearEndDate = new ArrayList<Integer>();
		List<Integer> listMonth = new ArrayList<Integer>();
		List<Integer> listDay = new ArrayList<Integer>();
		// Danh sách nhóm và trình độ tiếng Nhật.
		List<MstGroup> listGroup = new ArrayList<MstGroup>();
		List<MstJapan> listJapan = new ArrayList<MstJapan>();

		MstGroupLogicImpl groupLogic = new MstGroupLogicImpl();
		MstJapanLogicImpl japanLogic = new MstJapanLogicImpl();
		/*
		 * Tạo dự liệu cho các danh sách khai báo ở trên.
		 */
		try {
			int nowYear = Common.getNowYear();
			listYear = Common.getListYear(Constant.MIN_YEAR, nowYear);
			listYearEndDate = Common
					.getListYear(Constant.MIN_YEAR, nowYear + 1);
			listMonth = Common.getListMonth();
			listDay = Common.getListDay();

			listGroup = groupLogic.getAllMstGroups();
			listJapan = japanLogic.getAllMstJapan();
			// Lưu dữ liệu vào request
			request.setAttribute("listJapan", listJapan);
			request.setAttribute("listGroup", listGroup);
			request.setAttribute("listYear", listYear);
			request.setAttribute("listYearEndDate", listYearEndDate);
			request.setAttribute("listMonth", listMonth);
			request.setAttribute("listDay", listDay);
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	/**
	 * Set giá trị hiển thị mặc định cho màn hình ADM003.
	 * 
	 * @return UserInfor thông tin user.
	 * @param request
	 *            HttpServletRequest
	 * @param response
	 *            HttpServletResponse
	 * @throws ServletException
	 * @throws IOException
	 */
	protected UserInfor setDefaultValue(HttpServletRequest request,
			HttpServletResponse response) throws ServletException, IOException {

		int nowYear = Common.getNowYear();
		int nowMonth = Calendar.getInstance().get(Calendar.MONTH) + 1;
		int nowDay = Calendar.getInstance().get(Calendar.DATE);

		UserInfor userInfor = new UserInfor();

		String loginName = "";
		String fullName = "";
		int groupId = 0;
		String fullNameKana = "";

		int[] birthdayADM003 = new int[3];
		birthdayADM003[0] = nowYear;
		birthdayADM003[1] = nowMonth;
		birthdayADM003[2] = nowDay;

		String email = "";
		String tel = "";
		String password = "";
		String passwordConfirm = "";
		String codeLevel = "";

		int[] startDateADM003 = new int[3];
		startDateADM003[0] = nowYear;
		startDateADM003[1] = nowMonth;
		startDateADM003[2] = nowDay;

		int[] endDateADM003 = new int[3];
		endDateADM003[0] = nowYear + 1;
		endDateADM003[1] = nowMonth;
		endDateADM003[2] = nowDay;

		String totalADM003 = "";
		/*
		 * 
		 * Set các thuộc tính cho userInfor.
		 */
		userInfor.setLoginName(loginName);
		userInfor.setGroupId(groupId);
		userInfor.setFullName(fullName);
		userInfor.setFullNameKana(fullNameKana);
		userInfor.setBirthdayADM003(birthdayADM003);
		userInfor.setEmail(email);
		userInfor.setTel(tel);
		userInfor.setPassword(password);
		userInfor.setPassword(passwordConfirm);
		userInfor.setCodeLevel(codeLevel);
		userInfor.setStartDateADM003(startDateADM003);
		userInfor.setEndDateADM003(endDateADM003);
		userInfor.setTotalADM003(totalADM003);

		// Trả về userInfor.
		return userInfor;
	}
}
